package com.core.cloudbusiness.system.log.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.core.cloundbusinessapi.system.log.dto.LoginLogDTO;
import com.core.cloundbusinessapi.system.log.vo.LoginLogQueryVO;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * @author =====Lqj=====
 * @className LoginLogMapper
 * @description 登录日志Mapper
 * @create 2024/12/16 13:00
 **/
@Repository
public interface LoginLogMapper extends BaseMapper<LoginLogDTO> {

    /**
     * 分页查询登录日志
     * @param page 分页参数
     * @param queryVO 查询条件
     * @return 分页结果
     */
    IPage<LoginLogDTO> selectLoginLogPage(@Param("page") Page<LoginLogDTO> page, 
                                         @Param("query") LoginLogQueryVO queryVO);

    /**
     * 根据token查询登录日志
     * @param token token
     * @return 登录日志
     */
    LoginLogDTO selectByToken(@Param("token") String token);

    /**
     * 更新退出时间
     * @param token token
     * @param logoutTime 退出时间
     * @param sessionDuration 会话时长
     * @return 更新数量
     */
    int updateLogoutTime(@Param("token") String token, 
                        @Param("logoutTime") Date logoutTime, 
                        @Param("sessionDuration") Long sessionDuration);

    /**
     * 批量删除登录日志
     * @param ids ID列表
     * @return 删除数量
     */
    int batchDeleteByIds(@Param("ids") Long[] ids);

    /**
     * 清理过期日志
     * @param expireDate 过期日期
     * @return 清理数量
     */
    int deleteExpiredLogs(@Param("expireDate") Date expireDate);

    /**
     * 获取用户最近登录记录
     * @param userId 用户ID
     * @param limit 限制数量
     * @return 登录记录列表
     */
    List<LoginLogDTO> selectRecentLoginLogs(@Param("userId") Long userId, 
                                           @Param("limit") int limit);

    /**
     * 统计登录次数
     * @param userId 用户ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 登录次数
     */
    long countLoginTimes(@Param("userId") Long userId, 
                        @Param("startTime") Date startTime, 
                        @Param("endTime") Date endTime);

    /**
     * 统计登录成功次数
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 成功次数
     */
    long countSuccessLogins(@Param("startTime") Date startTime, 
                           @Param("endTime") Date endTime);

    /**
     * 统计登录失败次数
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 失败次数
     */
    long countFailLogins(@Param("startTime") Date startTime, 
                        @Param("endTime") Date endTime);

    /**
     * 统计独立用户数
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 独立用户数
     */
    long countUniqueUsers(@Param("startTime") Date startTime, 
                         @Param("endTime") Date endTime);

    /**
     * 统计各设备类型登录次数
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 设备类型统计
     */
    List<Map<String, Object>> countByDeviceType(@Param("startTime") Date startTime, 
                                               @Param("endTime") Date endTime);

    /**
     * 统计各浏览器登录次数
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 浏览器统计
     */
    List<Map<String, Object>> countByBrowser(@Param("startTime") Date startTime, 
                                            @Param("endTime") Date endTime);

    /**
     * 统计各操作系统登录次数
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 操作系统统计
     */
    List<Map<String, Object>> countByOs(@Param("startTime") Date startTime, 
                                       @Param("endTime") Date endTime);

    /**
     * 统计登录地区分布
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 地区统计
     */
    List<Map<String, Object>> countByLocation(@Param("startTime") Date startTime, 
                                             @Param("endTime") Date endTime);

    /**
     * 获取登录失败最多的IP
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param limit 限制数量
     * @return IP统计
     */
    List<Map<String, Object>> getTopFailIps(@Param("startTime") Date startTime, 
                                           @Param("endTime") Date endTime, 
                                           @Param("limit") int limit);
}
